package rmaqlc31.basic;

import java.util.Scanner;

public class J16_Calcurator {

	public static void main(String[] args) {
		// 상속, 인터페이스, 기본클래스를 이용해서
		// 사칙연산을 수행하는 계산기 프로그램 작성
		
//		J16Add add = new J16Add();
//		add.setValue(3, 7);
//		System.out.println(add.toString());
//		System.out.println(add.calculate());
//		
//		J16Mul mul = new J16Mul();
//		mul.setValue(30, 70);
//		System.out.println(mul.toString());
//		System.out.println(mul.calculate());
		// +, x 연산을 위해
		// J16Add, J16Mul 클래스 객체를 생성했음
		// 하지만, -, / 연산을 위해
		// J16Sub, J16Div 객체도 생성해야 함
		// 사칙연산을 위해 불필요한 객체를
		// 마구 생성하는  낭비가 발생
		// 해결책 - 상위 자료형 변환 upcasting을 이용
		
		Scanner sc = new Scanner(System.in);
		
		System.out.print("두 정수와 연산자를 입력하세요 : ");
		
		J16Cal c = new J16Add();
		double x = sc.nextDouble();
		double y = sc.nextDouble();
		String o = sc.next();
		
		if(o.equals("+")){
		c.setValue(x, y);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		}
		else if (o.equals("*")){
		c = new J16Mul();
		c.setValue(x, y);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		}
		// +, x 연산을 위해 J16Add, J16Mul의
		// 부모인 J16 객체만 생성
		// 추후 -, / 연산을 위해
		// J16Sub, J16Div 객체를 생성하더라도
		// 부모인 J16Cal 객체만 가져다 쓰면 됨
		
		else if(o.equals("-")){
		c = new J16Sub();
		c.setValue(x, y);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		}
		
		else if(o.equals("/")){
		c = new J16Div();
		c.setValue(x, y);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		}
		
		sc.close();
		
	} // main

} // class

// 인터페이스
interface J16CalService{
	void setValue(double x, double y);
	double calculate();
}

// 클래스
class J16Cal implements J16CalService{
	private double x;
	private double y;
	
	public J16Cal() {}

	public double getX() {
		return x;
	}

	public void setX(double x) {
		this.x = x;
	}

	public double getY() {
		return y;
	}

	public void setY(double y) {
		this.y = y;
	}

	@Override
	public String toString() {
		return "J16Cal [x=" + x + ", y=" + y + "]";
	}

	@Override
	public void setValue(double x, double y) {
		this.x = x;
		this.y = y;
	}

	@Override
	public double calculate() {
		return 0;
	}
	
	// 멤버변수 x,y의 초기화 작업은
	// setValue 메서드가 대신하므로
	// 생성자는 주석 처리함
//	public J16Cal(int x, int y) {
//		this.x = x;
//		this.y = y;
//	}

	
	
	
}

class J16Add extends J16Cal{
	@Override
	public double calculate() {
		return getX()+getY();
	}
}

class J16Mul extends J16Cal{
	@Override
	public double calculate() {
		return getX()*getY();
	}
}

class J16Sub extends J16Cal{
	@Override
	public double calculate() {
		return getX()-getY();
	}
}

class J16Div extends J16Cal{
	@Override
	public double calculate() {
		return getX()/getY();
	}
}










